<?php

// 设置不在网页上输出错误信息
error_reporting(E_ERROR | E_PARSE);

// 取得用户输入的网址
$webpageURL = htmlspecialchars($_POST['newsUrl']);

// 如果用户没有输入内容，则输出提示，并结束当前脚本的运行
if($webpageURL == null) {
    echo "<p>请输入正确的网址。</p>";
    exit;
}

// 根据网址取得网页内容
$webpageContent = file_get_contents($webpageURL);

$doc = new DOMDocument();
$doc->loadHTML($webpageContent);
$finder = new DomXPath($doc);

// 创建一个文件，用于临时存储输出结果
$fileName = "textNews" . rand() . ".txt";
$fp = fopen($fileName, 'w');

// =============================================================================

// 对用户输入的网址进行解析，判断新闻链接来源于哪个网站，
// 根据不同的来源网站，执行不同的操作

switch (parse_url($webpageURL, PHP_URL_HOST)) {

    // 新闻来源于光明日报手机版时
    case 'gmrb3.wap.gmw.cn':

        $nodes = $finder->query("//div[@class='msg_page']");

        // 写入新闻来源
        $nodes = $finder->query("//div[@class='msg_page']");
        foreach ($nodes as $node) {
            if($node->nodeValue != null){
                fwrite($fp, "来源：" . $node->nodeValue);
            }
        }

        // 写入新闻标题
        fwrite($fp, PHP_EOL . PHP_EOL . "标题：" . PHP_EOL);

        // preTitle
        $nodes = $finder->query("//td[@class='font02 tts_preTitle']");
        foreach ($nodes as $node) {
            if($node->nodeValue != null){
                fwrite($fp, $node->nodeValue . PHP_EOL);
            }
        }

        // mainTitle
        $nodes = $finder->query("//h1[@class='con_title font01 tts_mainTitle']");
        foreach ($nodes as $node) {
            fwrite($fp, $node->nodeValue);
        }

        // subTitle
        $nodes = $finder->query("//td[@class='font02 tts_subTitle']");
        foreach ($nodes as $node) {
            if($node->nodeValue != null) {
                fwrite($fp, PHP_EOL . $node->nodeValue);
            }
        }

        // 写入新闻记者
        fwrite($fp, PHP_EOL . PHP_EOL);
        $nodes = $finder->query("//div[@class='font02 tts_author']");
        foreach ($nodes as $node) {
            if($node->nodeValue != null) {
                fwrite($fp, "作者：" . $node->nodeValue . PHP_EOL . PHP_EOL);
            }
        }

        // 写入新闻正文
        $nodes = $finder->query("//div[@id='ozoom']");
        foreach ($nodes as $node) {
            $ps = $node->getElementsByTagName('p');
        }

        fwrite($fp, "------------------------------" . PHP_EOL . PHP_EOL);

        foreach ($ps as $p) {
            fwrite($fp, $p->nodeValue . PHP_EOL . PHP_EOL);
        }

        break;

    // 新闻来源于中国青年报手机版时
    case 'mzqb.cyol.com':


        $nodeList = $finder->query("//div[@class='title']");

        // 写入标题
        fwrite($fp, "标题：");

        // preTitle
        $preTitle = $nodeList[0]->getElementsByTagName('h2')->item(0)->nodeValue;
        if( $preTitle != null) {
            fwrite($fp, PHP_EOL . $preTitle);
        }

        // mainTitle
        $mainTitle = $nodeList[0]->getElementsByTagName('h1')->item(0)->nodeValue;
        fwrite($fp, PHP_EOL . $mainTitle);

        // subTitle
        $subTitle = $nodeList[0]->getElementsByTagName('h2')->item(1)->nodeValue;
        fwrite($fp, PHP_EOL . $subTitle);

        // 写入作者与来源
        fwrite($fp, PHP_EOL . PHP_EOL . "作者：" . PHP_EOL . $nodeList[0]->getElementsByTagName('h2')->item(2)->nodeValue);

        // 写入新闻正文
        $nodes = $finder->query("//div[@id='ozoom']");
        foreach ($nodes as $node) {
            $ps = $node->getElementsByTagName('p');
        }

        fwrite($fp, PHP_EOL . PHP_EOL . "------------------------------" . PHP_EOL . PHP_EOL);

        foreach ($ps as $p) {
            fwrite($fp, $p->nodeValue . PHP_EOL . PHP_EOL);
        }

        break;

    // 以上都不匹配时执行
    default:
        echo "<p>暂不支持该站点的新闻。</p>";
        exit();
}


// =============================================================================
// 让用户下载文件
//

$file = $fileName;

if (file_exists($file)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename="'.basename($file).'"');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    readfile($file);
}

// =============================================================================
// 删除文件
// 这里有 bug，在服务器 PHP 7.0.25 上无法正常删除文件，在本地 PHP 7.3.0 上却又可以。

unlink($fileName);

// =============================================================================
// 参考资料:
// https://stackoverflow.com/questions/6366351/getting-dom-elements-by-classname
// https://stackoverflow.com/questions/15184641/get-all-elements-by-class-name-using-domdocument
// http://saxon.sourceforge.net/saxon6.5.3/expressions.html
